package com.christina.engine.observer;

/**
 * 处理事件监听器接口
 * 定义了事件监听器的基本契约
 * 
 * @author Christina
 */
public interface ProcessingEventListener {
    
    /**
     * 处理事件
     * 
     * @param event 处理事件
     */
    void onEvent(ProcessingEvent event);
    
    /**
     * 获取监听器名称
     * 
     * @return 监听器名称
     */
    String getListenerName();
    
    /**
     * 获取监听器优先级
     * 数值越大优先级越高
     * 
     * @return 优先级
     */
    default int getPriority() {
        return 0;
    }
    
    /**
     * 检查是否支持指定的事件类型
     * 
     * @param eventType 事件类型
     * @return 是否支持
     */
    boolean supportsEventType(ProcessingEvent.EventType eventType);
    
    /**
     * 检查监听器是否启用
     * 
     * @return 是否启用
     */
    default boolean isEnabled() {
        return true;
    }
    
    /**
     * 检查是否为异步监听器
     * 
     * @return 是否异步
     */
    default boolean isAsync() {
        return false;
    }
    
    /**
     * 获取监听器类型
     * 
     * @return 监听器类型
     */
    default ListenerType getListenerType() {
        return ListenerType.BUSINESS;
    }
    
    /**
     * 处理事件异常
     * 
     * @param event 事件
     * @param exception 异常
     */
    default void onError(ProcessingEvent event, Exception exception) {
        // 默认实现：记录错误日志
        System.err.println("Error processing event " + event.getEventId() + 
                          " in listener " + getListenerName() + ": " + exception.getMessage());
    }
    
    /**
     * 监听器类型枚举
     */
    enum ListenerType {
        /**
         * 系统监听器
         */
        SYSTEM,
        
        /**
         * 业务监听器
         */
        BUSINESS,
        
        /**
         * 监控监听器
         */
        MONITORING,
        
        /**
         * 审计监听器
         */
        AUDIT
    }
}